作用域其實就是變數可以在哪裡使用的範圍。我們主要有兩種作用域:區域作用域 和 全域作用域。
(1)區域作用域 (Local Scope): 當你在一個函數裡定義變數時,那個變數只在那個函數內部有效,函數外面看不到。
function sayHello() {
let message = "Hello, World!";
console.log(message); // 輸出: Hello, World!
}
sayHello();
// 如果你試圖在這裡用 message 會出錯,因為它只屬於 sayHello 函數
(2)全域作用域 (Global Scope): 這種變數定義在函數外,所以整個程式裡都能用。
let globalVar = "我是全域變數";
function showGlobalVar() {
console.log(globalVar); // 輸出: 我是全域變數
}
showGlobalVar();
閉包就是讓函數可以記住它所屬的範圍,哪怕這個範圍已經不在了,這讓它能一直存取到外面的變數。
function outerFunction() {
let outerVar = "我是外部變數";
function innerFunction() {
console.log(outerVar); // 雖然 outerVar 是在外面定義的,但 innerFunction 仍能存取它
}
return innerFunction;
}
const closure = outerFunction();
closure(); // 輸出: 我是外部變數
那閉包有什麼用呢?
ex:可以用閉包做一個計數器,來記住每次被呼叫到的次數
function counter() {
let count = 0;
return function() {
count++;
console.log(count); // 每次呼叫都會加 1
};
}
const increment = counter();
increment(); // 輸出: 1
increment(); // 輸出: 2